﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Exceptions;

namespace HerGoS.Administration.Engine
{
   public class GestorCuentaBancaria
    {

       public static CuentaBancaria Obtener(int oid)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
               repo.Nombre = "CUENTASBANCARIAS_SP";
               repo.AddParameter("@ACCION", "BYID");
               repo.AddParameter("@ID", oid);
               DataTable dt = repo.ExecuteDataTable();
               CuentaBancaria result = dt.ToGenericList<CuentaBancaria>(CuentaBancariaConverter).FirstOrDefault();
               return result;
           }
           catch (Exception ex)
           {
               throw new  CuentasBancariasGetException(ex);
           }
       }

//       @SUCURSAL	varchar(100)= NULL,	
//@DIRECCION	varchar(100)= NULL,	
//@LOCALIDAD	varchar(100)= NULL,	
//@IDTIPOCUENTABANCARIA	int	= NULL, 
//@PRINCIPAL BIT = NULL,
//@IDUSUARIO INT = NULL

       public static void Guardar(CuentaBancaria cuentaBancaria, ICuentasBancarias entidad)
       {
           try
           {
               IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
               repo.Nombre = "CUENTASBANCARIAS_PROC";
               repo.AddParameter("@ACCION", cuentaBancaria.Persistencia);
               repo.AddParameter("@ID", cuentaBancaria.OID);
               repo.AddParameter("@ENTIDAD", (entidad != null) ? entidad.GetType().Name : null);
               repo.AddParameter("@IDREGISTRO", (entidad != null) ? entidad.OID : 0);
               repo.AddParameter("@IDBANCO", cuentaBancaria.Banco.OID);
               repo.AddParameter("@IDTIPOCUENTABANCARIA", cuentaBancaria.TipoCuentaBancaria == null ? (int?) null : cuentaBancaria.TipoCuentaBancaria.OID);
               repo.AddParameter("@SUCURSAL", cuentaBancaria.Sucursal);
               repo.AddParameter("@DIRECCION", cuentaBancaria.Direccion);
               repo.AddParameter("@LOCALIDAD", cuentaBancaria.Localidad);
               repo.AddParameter("@DENOMINACION", cuentaBancaria.Denominacion);
               repo.AddParameter("@NUMERO", cuentaBancaria.Numero);
               repo.AddParameter("@CBU", cuentaBancaria.CBU);
               repo.AddParameter("@PRINCIPAL", cuentaBancaria.Principal);
               repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
               cuentaBancaria.OID = repo.ExecuteReturnValue().ToInteger();
               repo.Commit();

               //GestorBitacora.Guardar(cuentaBancaria);
           }
           catch (Exception ex)
           {
               throw new CuentasBancariasSaveException(ex);
           }
       }


       /// <summary>
       /// Guarda una lista de domicilios relacionada a una entidad
       /// </summary>
       /// <param name="domicilios">Lista de domicilios</param>
       /// <param name="entidad">Entidad</param>
       public static void Guardar(List<CuentaBancaria> cuentasBancarias, ICuentasBancarias entidad)
       {
           cuentasBancarias.ForEach(c => Guardar(c, entidad));
       }

       public static void Guardar(ICuentasBancarias entidad)
       {
           foreach (CuentaBancaria c in entidad.CuentasBancarias)
           {
               Guardar(c, entidad);
           }
       }

       public static void Eliminar(CuentaBancaria cuentaBancaria)
       {
           cuentaBancaria.Persistencia = EstadoPersistencia.DELETE;
           Guardar(cuentaBancaria, null);
       }

       /// <summary>
       /// Permite consultar los CuentasBancarias de una entidad
       /// </summary>
       /// <param name="entidad">Entidad consultada</param>
       /// <returns>Todos los CuentaBancaria de la entidad</returns>
       public static List<CuentaBancaria> Consultar(ICuentasBancarias entidad)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
               repo.Nombre = "CUENTASBANCARIAS_SP";
               repo.AddParameter("@ACCION", "CONSULTA");
               repo.AddParameter("@ID", null);
               repo.AddParameter("@ENTIDAD", entidad.GetType().Name);
               repo.AddParameter("@IDREGISTRO", entidad.OID);
               DataTable dt = repo.ExecuteDataTable();
               List<CuentaBancaria> result = dt.ToGenericList<CuentaBancaria>(CuentaBancariaConverter);
               return result;
           }
           catch (Exception ex)
           {
               throw new CuentasBancariasGetException(ex);
           }
       }

       public static List<CuentaBancaria> Activas(ICuentasBancarias entidad)
       {
           try
           {
               return entidad.CuentasBancarias.Where(y => y.Persistencia != EstadoPersistencia.DELETE).ToList();
           }
           catch (Exception ex)
           {
               throw new CuentasBancariasGetException(ex);
           }
       }
       #region Converter
       public static CuentaBancaria CuentaBancariaConverter(DataRow row)
       {
           return new CuentaBancaria
           {
               OID = row["cbID"].ToInteger(),
               Banco = GestorBanco.Obtener(row["cbIDBANCO"].ToInteger())??null,
               CBU = row["cbCBU"].ToString(),
               Numero = row["cbNUMERO"].ToString(),
               Principal = row["cbPRINCIPAL"].ToBoolean(),
               Denominacion = row["cbDENOMINACION"].ToString(), 
               Sucursal = row["cbSUCURSAL"].ToString(),
               Direccion = row["cbDIRECCION"].ToString(),
               Localidad = row["cbLOCALIDAD"].ToString(),
               TipoCuentaBancaria = GestorTipoCuentaBancaria.Obtener(row["cbIDTIPOCUENTABANCARIA"].ToInteger()),
               Persistencia = EstadoPersistencia.UPDATE
           };
       }
       #endregion

    }
}
